﻿/*
 Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved.
 For licensing, see LICENSE.md or http://ckeditor.com/license
 */
(function () {
    function y(c) {
        return c.type == CKEDITOR.NODE_TEXT && 0 < c.getLength() && (!o || !c.isReadOnly())
    }

    function s(c) {
        return!(c.type == CKEDITOR.NODE_ELEMENT && c.isBlockBoundary(CKEDITOR.tools.extend({}, CKEDITOR.dtd.$empty, CKEDITOR.dtd.$nonEditable)))
    }

    var o, t = function () {
        return{textNode: this.textNode, offset: this.offset, character: this.textNode ? this.textNode.getText().charAt(this.offset) : null, hitMatchBoundary: this._.matchBoundary}
    }, u = ["find", "replace"], p = [
        ["txtFindFind", "txtFindReplace"],
        ["txtFindCaseChk",
            "txtReplaceCaseChk"],
        ["txtFindWordChk", "txtReplaceWordChk"],
        ["txtFindCyclic", "txtReplaceCyclic"]
    ], n = function (c, g) {
        function n(a, b) {
            var d = c.createRange();
            d.setStart(a.textNode, b ? a.offset : a.offset + 1);
            d.setEndAt(c.editable(), CKEDITOR.POSITION_BEFORE_END);
            return d
        }

        function q(a) {
            var b = c.getSelection(), d = c.editable();
            b && !a ? (a = b.getRanges()[0].clone(), a.collapse(!0)) : (a = c.createRange(), a.setStartAt(d, CKEDITOR.POSITION_AFTER_START));
            a.setEndAt(d, CKEDITOR.POSITION_BEFORE_END);
            return a
        }

        var v = new CKEDITOR.style(CKEDITOR.tools.extend({attributes: {"data-cke-highlight": 1},
            fullMatch: 1, ignoreReadonly: 1, childRule: function () {
                return 0
            }}, c.config.find_highlight, !0)), l = function (a, b) {
            var d = this, c = new CKEDITOR.dom.walker(a);
            c.guard = b ? s : function (a) {
                !s(a) && (d._.matchBoundary = !0)
            };
            c.evaluator = y;
            c.breakOnFalse = 1;
            a.startContainer.type == CKEDITOR.NODE_TEXT && (this.textNode = a.startContainer, this.offset = a.startOffset - 1);
            this._ = {matchWord: b, walker: c, matchBoundary: !1}
        };
        l.prototype = {next: function () {
            return this.move()
        }, back: function () {
            return this.move(!0)
        }, move: function (a) {
            var b = this.textNode;
            if (null === b)return t.call(this);
            this._.matchBoundary = !1;
            if (b && a && 0 < this.offset)this.offset--; else if (b && this.offset < b.getLength() - 1)this.offset++; else {
                for (b = null; !b && !(b = this._.walker[a ? "previous" : "next"].call(this._.walker), this._.matchWord && !b || this._.walker._.end););
                this.offset = (this.textNode = b) ? a ? b.getLength() - 1 : 0 : 0
            }
            return t.call(this)
        }};
        var r = function (a, b) {
            this._ = {walker: a, cursors: [], rangeLength: b, highlightRange: null, isMatched: 0}
        };
        r.prototype = {toDomRange: function () {
            var a = c.createRange(), b = this._.cursors;
            if (1 > b.length) {
                var d = this._.walker.textNode;
                if (d)a.setStartAfter(d); else return null
            } else d = b[0], b = b[b.length - 1], a.setStart(d.textNode, d.offset), a.setEnd(b.textNode, b.offset + 1);
            return a
        }, updateFromDomRange: function (a) {
            var b = new l(a);
            this._.cursors = [];
            do a = b.next(), a.character && this._.cursors.push(a); while (a.character);
            this._.rangeLength = this._.cursors.length
        }, setMatched: function () {
            this._.isMatched = !0
        }, clearMatched: function () {
            this._.isMatched = !1
        }, isMatched: function () {
            return this._.isMatched
        }, highlight: function () {
            if (!(1 >
                this._.cursors.length)) {
                this._.highlightRange && this.removeHighlight();
                var a = this.toDomRange(), b = a.createBookmark();
                v.applyToRange(a);
                a.moveToBookmark(b);
                this._.highlightRange = a;
                b = a.startContainer;
                b.type != CKEDITOR.NODE_ELEMENT && (b = b.getParent());
                b.scrollIntoView();
                this.updateFromDomRange(a)
            }
        }, removeHighlight: function () {
            if (this._.highlightRange) {
                var a = this._.highlightRange.createBookmark();
                v.removeFromRange(this._.highlightRange);
                this._.highlightRange.moveToBookmark(a);
                this.updateFromDomRange(this._.highlightRange);
                this._.highlightRange = null
            }
        }, isReadOnly: function () {
            return!this._.highlightRange ? 0 : this._.highlightRange.startContainer.isReadOnly()
        }, moveBack: function () {
            var a = this._.walker.back(), b = this._.cursors;
            a.hitMatchBoundary && (this._.cursors = b = []);
            b.unshift(a);
            b.length > this._.rangeLength && b.pop();
            return a
        }, moveNext: function () {
            var a = this._.walker.next(), b = this._.cursors;
            a.hitMatchBoundary && (this._.cursors = b = []);
            b.push(a);
            b.length > this._.rangeLength && b.shift();
            return a
        }, getEndCharacter: function () {
            var a = this._.cursors;
            return 1 > a.length ? null : a[a.length - 1].character
        }, getNextCharacterRange: function (a) {
            var b, d;
            d = this._.cursors;
            d = (b = d[d.length - 1]) && b.textNode ? new l(n(b)) : this._.walker;
            return new r(d, a)
        }, getCursors: function () {
            return this._.cursors
        }};
        var w = function (a, b) {
            var d = [-1];
            b && (a = a.toLowerCase());
            for (var c = 0; c < a.length; c++)for (d.push(d[c] + 1); 0 < d[c + 1] && a.charAt(c) != a.charAt(d[c + 1] - 1);)d[c + 1] = d[d[c + 1] - 1] + 1;
            this._ = {overlap: d, state: 0, ignoreCase: !!b, pattern: a}
        };
        w.prototype = {feedCharacter: function (a) {
            for (this._.ignoreCase &&
                     (a = a.toLowerCase()); ;) {
                if (a == this._.pattern.charAt(this._.state))return this._.state++, this._.state == this._.pattern.length ? (this._.state = 0, 2) : 1;
                if (this._.state)this._.state = this._.overlap[this._.state]; else return 0
            }
            return null
        }, reset: function () {
            this._.state = 0
        }};
        var z = /[.,"'?!;: \u0085\u00a0\u1680\u280e\u2028\u2029\u202f\u205f\u3000]/, x = function (a) {
                if (!a)return!0;
                var b = a.charCodeAt(0);
                return 9 <= b && 13 >= b || 8192 <= b && 8202 >= b || z.test(a)
            }, e = {searchRange: null, matchRange: null, find: function (a, b, d, f, e, A) {
                this.matchRange ?
                    (this.matchRange.removeHighlight(), this.matchRange = this.matchRange.getNextCharacterRange(a.length)) : this.matchRange = new r(new l(this.searchRange), a.length);
                for (var i = new w(a, !b), j = 0, k = "%"; null !== k;) {
                    for (this.matchRange.moveNext(); k = this.matchRange.getEndCharacter();) {
                        j = i.feedCharacter(k);
                        if (2 == j)break;
                        this.matchRange.moveNext().hitMatchBoundary && i.reset()
                    }
                    if (2 == j) {
                        if (d) {
                            var h = this.matchRange.getCursors(), m = h[h.length - 1], h = h[0], g = c.createRange();
                            g.setStartAt(c.editable(), CKEDITOR.POSITION_AFTER_START);
                            g.setEnd(h.textNode, h.offset);
                            h = g;
                            m = n(m);
                            h.trim();
                            m.trim();
                            h = new l(h, !0);
                            m = new l(m, !0);
                            if (!x(h.back().character) || !x(m.next().character))continue
                        }
                        this.matchRange.setMatched();
                        !1 !== e && this.matchRange.highlight();
                        return!0
                    }
                }
                this.matchRange.clearMatched();
                this.matchRange.removeHighlight();
                return f && !A ? (this.searchRange = q(1), this.matchRange = null, arguments.callee.apply(this, Array.prototype.slice.call(arguments).concat([!0]))) : !1
            }, replaceCounter: 0, replace: function (a, b, d, f, e, g, i) {
                o = 1;
                a = 0;
                if (this.matchRange &&
                    this.matchRange.isMatched() && !this.matchRange._.isReplaced && !this.matchRange.isReadOnly()) {
                    this.matchRange.removeHighlight();
                    b = this.matchRange.toDomRange();
                    d = c.document.createText(d);
                    if (!i) {
                        var j = c.getSelection();
                        j.selectRanges([b]);
                        c.fire("saveSnapshot")
                    }
                    b.deleteContents();
                    b.insertNode(d);
                    i || (j.selectRanges([b]), c.fire("saveSnapshot"));
                    this.matchRange.updateFromDomRange(b);
                    i || this.matchRange.highlight();
                    this.matchRange._.isReplaced = !0;
                    this.replaceCounter++;
                    a = 1
                } else a = this.find(b, f, e, g, !i);
                o = 0;
                return a
            }},
            f = c.lang.find;
        return{title: f.title, resizable: CKEDITOR.DIALOG_RESIZE_NONE, minWidth: 350, minHeight: 170, buttons: [CKEDITOR.dialog.cancelButton(c, {label: c.lang.common.close})], contents: [
            {id: "find", label: f.find, title: f.find, accessKey: "", elements: [
                {type: "hbox", widths: ["230px", "90px"], children: [
                    {type: "text", id: "txtFindFind", label: f.findWhat, isChanged: !1, labelLayout: "horizontal", accessKey: "F"},
                    {type: "button", id: "btnFind", align: "left", style: "width:100%", label: f.find, onClick: function () {
                        var a = this.getDialog();
                        e.find(a.getValueOf("find", "txtFindFind"), a.getValueOf("find", "txtFindCaseChk"), a.getValueOf("find", "txtFindWordChk"), a.getValueOf("find", "txtFindCyclic")) || alert(f.notFoundMsg)
                    }}
                ]},
                {type: "fieldset", label: CKEDITOR.tools.htmlEncode(f.findOptions), style: "margin-top:29px", children: [
                    {type: "vbox", padding: 0, children: [
                        {type: "checkbox", id: "txtFindCaseChk", isChanged: !1, label: f.matchCase},
                        {type: "checkbox", id: "txtFindWordChk", isChanged: !1, label: f.matchWord},
                        {type: "checkbox", id: "txtFindCyclic", isChanged: !1, "default": !0,
                            label: f.matchCyclic}
                    ]}
                ]}
            ]},
            {id: "replace", label: f.replace, accessKey: "M", elements: [
                {type: "hbox", widths: ["230px", "90px"], children: [
                    {type: "text", id: "txtFindReplace", label: f.findWhat, isChanged: !1, labelLayout: "horizontal", accessKey: "F"},
                    {type: "button", id: "btnFindReplace", align: "left", style: "width:100%", label: f.replace, onClick: function () {
                        var a = this.getDialog();
                        e.replace(a, a.getValueOf("replace", "txtFindReplace"), a.getValueOf("replace", "txtReplace"), a.getValueOf("replace", "txtReplaceCaseChk"), a.getValueOf("replace",
                            "txtReplaceWordChk"), a.getValueOf("replace", "txtReplaceCyclic")) || alert(f.notFoundMsg)
                    }}
                ]},
                {type: "hbox", widths: ["230px", "90px"], children: [
                    {type: "text", id: "txtReplace", label: f.replaceWith, isChanged: !1, labelLayout: "horizontal", accessKey: "R"},
                    {type: "button", id: "btnReplaceAll", align: "left", style: "width:100%", label: f.replaceAll, isChanged: !1, onClick: function () {
                        var a = this.getDialog();
                        e.replaceCounter = 0;
                        e.searchRange = q(1);
                        e.matchRange && (e.matchRange.removeHighlight(), e.matchRange = null);
                        for (c.fire("saveSnapshot"); e.replace(a,
                            a.getValueOf("replace", "txtFindReplace"), a.getValueOf("replace", "txtReplace"), a.getValueOf("replace", "txtReplaceCaseChk"), a.getValueOf("replace", "txtReplaceWordChk"), !1, !0););
                        e.replaceCounter ? (alert(f.replaceSuccessMsg.replace(/%1/, e.replaceCounter)), c.fire("saveSnapshot")) : alert(f.notFoundMsg)
                    }}
                ]},
                {type: "fieldset", label: CKEDITOR.tools.htmlEncode(f.findOptions), children: [
                    {type: "vbox", padding: 0, children: [
                        {type: "checkbox", id: "txtReplaceCaseChk", isChanged: !1, label: f.matchCase},
                        {type: "checkbox", id: "txtReplaceWordChk",
                            isChanged: !1, label: f.matchWord},
                        {type: "checkbox", id: "txtReplaceCyclic", isChanged: !1, "default": !0, label: f.matchCyclic}
                    ]}
                ]}
            ]}
        ], onLoad: function () {
            var a = this, b, c = 0;
            this.on("hide", function () {
                c = 0
            });
            this.on("show", function () {
                c = 1
            });
            this.selectPage = CKEDITOR.tools.override(this.selectPage, function (f) {
                return function (e) {
                    f.call(a, e);
                    var g = a._.tabs[e], i;
                    i = "find" === e ? "txtFindWordChk" : "txtReplaceWordChk";
                    b = a.getContentElement(e, "find" === e ? "txtFindFind" : "txtFindReplace");
                    a.getContentElement(e, i);
                    g.initialized || (CKEDITOR.document.getById(b._.inputId),
                        g.initialized = !0);
                    if (c) {
                        var j, e = "find" === e ? 1 : 0, g = 1 - e, k, h = p.length;
                        for (k = 0; k < h; k++)i = this.getContentElement(u[e], p[k][e]), j = this.getContentElement(u[g], p[k][g]), j.setValue(i.getValue())
                    }
                }
            })
        }, onShow: function () {
            e.searchRange = q();
            var a = this.getParentEditor().getSelection().getSelectedText(), b = this.getContentElement(g, "find" == g ? "txtFindFind" : "txtFindReplace");
            b.setValue(a);
            b.select();
            this.selectPage(g);
            this[("find" == g && this._.editor.readOnly ? "hide" : "show") + "Page"]("replace")
        }, onHide: function () {
            var a;
            e.matchRange &&
                e.matchRange.isMatched() && (e.matchRange.removeHighlight(), c.focus(), (a = e.matchRange.toDomRange()) && c.getSelection().selectRanges([a]));
            delete e.matchRange
        }, onFocus: function () {
            return"replace" == g ? this.getContentElement("replace", "txtFindReplace") : this.getContentElement("find", "txtFindFind")
        }}
    };
    CKEDITOR.dialog.add("find", function (c) {
        return n(c, "find")
    });
    CKEDITOR.dialog.add("replace", function (c) {
        return n(c, "replace")
    })
})();